from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex

class prpcrypt():
    def __init__(self, key):
        self.key = self.supplement(key)
        self.mode = AES.MODE_ECB

    def supplement(self,text):
        # 如果text不是16的倍数【加密文本text必须为16的倍数！】，那就补足为16的倍数
        text = text.encode("utf-8")
        # 这里密钥key 长度必须为16（AES-128）、24（AES-192）、或32（AES-256）Bytes 长度.目前AES-128足够用
        length = 16
        count = len(text)
        add = length - (count % length)
        text = text + (b'\0' * add)
        return text

    # 加密函数，如果text不是16的倍数【加密文本text必须为16的倍数！】，那就补足为16的倍数
    def encrypt(self, text):
        cryptor = AES.new(self.key, self.mode, self.key)
        text = self.supplement(text)
        self.ciphertext = cryptor.encrypt(text)
        # 因为AES加密时候得到的字符串不一定是ascii字符集的，输出到终端或者保存时候可能存在问题
        # 所以这里统一把加密后的字符串转化为16进制字符串
        return b2a_hex(self.ciphertext).decode("ASCII")

    # 解密后，去掉补足的空格用strip() 去掉
    def decrypt(self, text):
        cryptor = AES.new(self.key, self.mode)
        plain_text = cryptor.decrypt(a2b_hex(text))
        #return plain_text.rstrip(b'\0').decode("utf-8")
        return bytes.decode(plain_text, 'utf-8').rstrip('\0')

    def decrypt2(self,text):
        try:
            cryptor = AES.new(self.key, self.mode)
            plain_text = cryptor.decrypt(a2b_hex(text))
        except Exception as e:
            print('--------异常')
            print(e)
            return text;
        else:
            return bytes.decode(plain_text, 'utf-8').rstrip('\0')

    def readLog(self):
        newLogFile = open('target.txt', 'w', encoding="utf-8")  # 清空文件内容再写
        with open('222.txt', 'r') as f:
            list1 = f.readlines()
            for i in range(0, len(list1)):
                text = list1[i].rstrip('\n').strip()
                log = self.decrypt2(text).rstrip('\n').strip()  # 解密
                print("log " + log)
                if log != None:
                    newLogFile.write(log)
                    newLogFile.write('\n')
        newLogFile.close()


if __name__ == '__main__':
    pc = prpcrypt('sdfoJBND47')  # 初始化密钥
    pc.readLog()
    e = pc.encrypt("my book is free")
    d = pc.decrypt(e)
    print(e, d)
    e = pc.encrypt("我是一个粉刷匠1231繁體testひらがな")
    d = pc.decrypt(e)
    print(e, d)
